package com.sky.task;

import com.sky.entity.Orders;
import com.sky.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

@Component
@Slf4j
public class OrderTask {

    @Autowired
    private OrderMapper orderMapper;

    //需求：订单未支付，到一定时间自动取消订单    派送中状态过长，设置为完成订单
    //订单未支付，每分钟查一下是否到达自动取消的时间限制
    //订单派送中，在某个时间点查一下（凌晨），是否还有派送中的订单

    /*订单支付超时判定*/
    @Scheduled(cron = "0 0/1 * * * ?")    //每分钟触发一次
    public void TimeOutProcess(){

        LocalDateTime OverTime = LocalDateTime.now().plusMinutes(-15);   //最早付款时间,如果下单时间小于该时间则说明超时支付

        List<Orders> ordersList = orderMapper.getByStatusAndOrderTime(Orders.PENDING_PAYMENT,OverTime);
                                                                        //待付款     //下单时间
        //遍历集合，取消对应订单
        if(ordersList != null && ordersList.size() > 0){
            for(Orders order : ordersList){
                order.setStatus(Orders.CANCELLED);
                order.setCancelReason("订单超时");
                order.setCancelTime(LocalDateTime.now());

                orderMapper.update(order);
            }
        }
        log.info("定时处理超时订单:{}", LocalDateTime.now());
    }

//    订单派送超时的定时任务
    @Scheduled(cron = "0 0 1 * * ?")     //每天凌晨一点查一下派送中的状态
    public void deliveryOutTime(){

        LocalDateTime OverTime = LocalDateTime.now().plusMinutes(-60);
        List<Orders> ordersList = orderMapper.getByStatusAndOrderTime(Orders.DELIVERY_IN_PROGRESS,OverTime);
                                                                    //派送中     //下单时间

        //遍历集合，完成对应订单
        if(ordersList != null && ordersList.size() > 0){
            for(Orders order : ordersList){
                order.setStatus(Orders.COMPLETED);
                order.setDeliveryTime(LocalDateTime.now());    //不要忘记设置送达时间

                orderMapper.update(order);
            }
        }

        log.info("处理一直在派送中的订单{}",LocalDateTime.now());
    }
}
